#ifndef	EXEC_TASKS_H
#define	EXEC_TASKS_H
//
//
//	Task Control Block, Signals, and Task flags.
//
//

#include <exec/nodes.h>
#include <exec/lists.h>

//
// Please use Exec functions to modify task structure fields, where available.
//
struct Task 
{
	struct Node	tc_Node;
    UBYTE   tc_Flags;
    UBYTE   tc_State;
    BYTE    tc_IDNestCnt;	    // intr disabled nesting
    BYTE    tc_TDNestCnt;	    // task disabled nesting
    ULONG   tc_SigAlloc;	    // sigs allocated 
    ULONG   tc_SigWait;	    	// sigs we are waiting for 
    ULONG   tc_SigRecvd;	    // sigs we have received 
    ULONG   tc_SigExcept;	    // sigs we will take excepts for 
    UWORD   tc_TrapAlloc;	    // traps allocated 
    UWORD   tc_TrapAble;	    // traps enabled 
    APTR    tc_ExceptData;	    // points to except data 
    APTR    tc_ExceptCode;	    // points to except code 
    APTR    tc_TrapData;	    // points to trap data 
    APTR    tc_TrapCode;	    // points to trap code 
    APTR    tc_SPReg;		    // stack pointer	    
    APTR    tc_SPLower;	   	 	// stack lower bound    
    APTR    tc_SPUpper;	   	 	// stack upper bound + 2
    VOID    (*tc_Switch)();	    // task losing CPU	  
    VOID    (*tc_Launch)();	    // task getting CPU  
	struct List	tc_MemEntry;		// Allocated memory. Freed by RemTask() 
    APTR    tc_UserData;	    // For use by the task; no restrictions! 
};

//
// Stack swap structure as passed to StackSwap()
//
struct	StackSwapStruct 
{
	APTR	stk_Lower;			// Lowest byte of stack 
	ULONG	stk_Upper;			// Upper end of stack (size + Lowest) 
	APTR	stk_Pointer;		// Stack pointer at switch point 
};

//----- Flag Bits ------------------------------------------
#define TB_PROCTIME	0
#define TB_ETASK	3
#define TB_STACKCHK	4
#define TB_EXCEPT	5
#define TB_SWITCH	6
#define TB_LAUNCH	7

#define TF_PROCTIME	(1L<<0)
#define TF_ETASK	(1L<<3)
#define TF_STACKCHK	(1L<<4)
#define TF_EXCEPT	(1L<<5)
#define TF_SWITCH	(1L<<6)
#define TF_LAUNCH	(1L<<7)

//----- Task States ----------------------------------------
#define TS_INVALID	0
#define TS_ADDED	1
#define TS_RUN		2
#define TS_READY	3
#define TS_WAIT		4
#define TS_EXCEPT	5
#define TS_REMOVED	6

//----- Predefined Signals -------------------------------------
#define SIGB_ABORT		0
#define SIGB_CHILD		1
#define SIGB_BLIT		4	// Note: same as SINGLE 
#define SIGB_SINGLE		4	// Note: same as BLIT 
#define SIGB_INTUITION	5
#define	SIGB_NET		7
#define SIGB_DOS		8

#define SIGF_ABORT		(1L<<0)
#define SIGF_CHILD		(1L<<1)
#define SIGF_BLIT		(1L<<4)
#define SIGF_SINGLE		(1L<<4)
#define SIGF_INTUITION	(1L<<5)
#define	SIGF_NET		(1L<<7)
#define SIGF_DOS		(1L<<8)

#endif	
